package com.sz.virtualbank.service.transaction;

import com.sz.virtualbank.dao.entity.TradeRecord;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 交易服务接口
 * 
 * @author Claude
 */
public interface TransactionService {
    
    /**
     * 创建交易记录
     * 
     * @param userId 用户ID
     * @param tradeType 交易类型
     * @param amount 交易金额
     * @param targetAccount 目标账户
     * @param remark 备注
     * @param channel 交易渠道
     * @return 交易记录
     */
    TradeRecord createTradeRecord(Long userId, Integer tradeType, BigDecimal amount, 
                                 String targetAccount, String remark, String channel);
    
    /**
     * 充值
     * 
     * @param userId 用户ID
     * @param amount 充值金额
     * @param channel 充值渠道
     * @return 交易记录
     */
    TradeRecord recharge(Long userId, BigDecimal amount, String channel);
    
    /**
     * 提现
     * 
     * @param userId 用户ID
     * @param amount 提现金额
     * @param channel 提现渠道
     * @return 交易记录
     */
    TradeRecord withdraw(Long userId, BigDecimal amount, String channel);
    
    /**
     * 转账
     * 
     * @param userId 用户ID
     * @param targetAccount 目标账户
     * @param amount 转账金额
     * @param remark 备注
     * @return 交易记录
     */
    TradeRecord transfer(Long userId, String targetAccount, BigDecimal amount, String remark);
    
    /**
     * 更新交易状态
     * 
     * @param tradeNo 交易流水号
     * @param status 交易状态
     * @return 是否成功
     */
    boolean updateTradeStatus(String tradeNo, Integer status);
    
    /**
     * 查询交易记录
     * 
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return 交易记录列表
     */
    List<TradeRecord> listTradeRecords(Long userId, int pageNum, int pageSize);
    
    /**
     * 根据类型查询交易记录
     * 
     * @param userId 用户ID
     * @param tradeType 交易类型
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return 交易记录列表
     */
    List<TradeRecord> listTradeRecordsByType(Long userId, Integer tradeType, int pageNum, int pageSize);
    
    /**
     * 根据日期范围查询交易记录
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return 交易记录列表
     */
    List<TradeRecord> listTradeRecordsByDateRange(Long userId, LocalDateTime startTime, 
                                                LocalDateTime endTime, int pageNum, int pageSize);
    
    /**
     * 查询交易记录总数
     * 
     * @param userId 用户ID
     * @return 交易记录总数
     */
    int countTradeRecords(Long userId);
    
    /**
     * 根据类型查询交易记录总数
     * 
     * @param userId 用户ID
     * @param tradeType 交易类型
     * @return 交易记录总数
     */
    int countTradeRecordsByType(Long userId, Integer tradeType);
    
    /**
     * 根据日期范围查询交易记录总数
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 交易记录总数
     */
    int countTradeRecordsByDateRange(Long userId, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 查询交易详情
     * 
     * @param tradeNo 交易流水号
     * @return 交易记录
     */
    TradeRecord getTradeDetail(String tradeNo);
}
